﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



//<1>for循环
			//打印1~10的数字
//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 10; i++)//初始化；判断（循环结束的条件）；调整
//							 //注：这三个都可以省略，但分号要留住
//	{
//		printf("%d ", i);
//	}
//
//	return 0;
//}

//练习：计算1~100之间3的倍数的数字之和
//（1）方案1
			//有1~100的数字
			//找出3的倍数
			//求和，把3的倍数加起来
//int main()
//{
//	int i = 0;
//	int num = 0;
//	for (i = 1; i <= 100; i++)//1~100的数字
//	{
//		if (i % 3 == 0)//找出3的倍数
//		{
//			num = num + i;//把3的倍数相加
//		}
//
//	}
//	printf("%d ", num);//因为是求3的倍数相加的和，而不是每个3的倍数，所以在for循环结束后打印
//	return 0;
//}

//（2）方案2
//int main()
//{
//	int i = 0;
//	int num = 0;
//	for (i = 3; i <= 100; i += 3)//1~100的数字；找出3的倍数
//	{
//		num += i;//将3的倍数相加
//	}
//	printf("%d ", num);
//
//	return 0;
//}



//<2>用do while循环在屏幕上打印1~10的值
//int main()
//{
//	int i = 1;
//	do
//	{
//		printf("%d ", i);//do while循环先执行，后判断，所以至少执行一次
//		i++;//i++要在do语句中实现，while只判断循环的结束，因为do先执行了i的打印
//	} while (i <= 10);//作为判断部分，判断循环的结束（循环结束的条件）
// 
//			//注：在do while循环中，必须要有while，但没有while语句，有了也不会进入并执行
//
//		return 0;
//}



//<3>练习
//输⼊⼀个正整数，计算这个整数是⼏位数？
//例如：
//输⼊：1234 输出：4
//输⼊：12 输出：2

			//思路：创建一个变量，用来输入一个正整数
			//		再创建一个变量，在去掉一个正整数的最低位时，就+1
			//		不断循环，直至这个正整数被去掉全部的位数
//int main()
//{
//	int i = 0;
//	printf("请输入一个正整数");
//	scanf("%d", &i);
//	int cnt = 0;
//	do
//	{
//		i = i / 10;
//			cnt++;
//	} while (i);
//		printf("%d", cnt);
//	return 0;
//}



//<4>whlie循环中的break和continue
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		if (i == 5)
//			break;//永久跳出当前所在循环，执行循环后边的代码
//		printf("%d ", i);
//		i = i + 1;
//	}
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		if (i == 5)
//			continue;
//		//continue是跳过一个当前循环后边的代码
//		//因为这⾥跳过了i = i+1，所以i⼀直为5，程序陷⼊和死循环
//		printf("%d ", i);
//		i = i + 1;
//	}
//	return 0;
//}



//<5>for循环中的break和continue
//int main()
//{
//	int i = 1;
//	for (i = 1; i <= 10; i++)
//	{
//		if (i == 5)
//			break;//永久跳出循环
//		printf("%d ", i);
//	}
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	for (i = 1; i <= 10; i++)
//	{
//		if (i == 5)
//			continue;//这⾥continue跳过了后边的打印，来到了i++的调整部分
//		printf("%d ", i);
//	}
//	return 0;
//}



//<6>do while循环中的break和continue
//int main()
//{
//	int i = 1;
//	do
//	{
//		if (i == 5)
//			break;
//		printf("%d ", i);
//		i = i + 1;
//	} while (i <= 10);
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	do
//	{
//		if (i == 5)
//			continue;//1,2,3,4,死循环
//		printf("%d ", i);
//		i = i + 1;
//	} while (i <= 10);
//	return 0;
//}



//<7>找出100~200之间的素数，并打印在屏幕上
			//有100~200之间的数
			//判断i是否为素数，需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字
			//如果2~i-1之间有数字能整除i，则i不是素数，如果都不能整除，则i是素数
//int main()
//{
//	int i = 0;
//	int count = 0;
//	
//	for (i = 100; i <= 200; i++)
//	{
//		int j = 0;
//		int flag = 1;//j和flag放在大for循环里面，小for循环外面，是因为循环之间有界限
//		//如果j和flag只写在大for外，j和flag就只能在大for循环中实现
//		//不能在小for循环中实现
//		//如果放在大for循环里，那么大for和小for都可以实现
//
//		for (j = 2; j <= i - 1; j++)
//		{
//						   
//			if (i % j == 0)//把不是素数的break
//				//这里不能用i % j != 0,因为这种要判断完所有的情况才能break
//						   //而i % j == 0,只要遇到一个这样的情况，就可以break
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			printf("%d \n", i);
//			count++;//计算素数的个数
//		}
//
//	}
//	printf("%d", count);//注：一个语句在哪，要看它在顺序，选择，循环的结构中发挥
//
//	return 0;
//}

//（2）优化
#include <math.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	
//	for (i = 100; i <= 200; i++)
//	{
//		int j = 0;
//		int flag = 1;//j和flag放在大for循环里面，小for循环外面，是因为循环之间有界限
//		//如果j和flag只写在大for外，j和flag就只能在大for循环中实现
//		//不能在小for循环中实现
//		//如果放在大for循环里，那么大for和小for都可以实现
//
//		for (j = 2; j <= sqrt(i); j++)//sqrt是一个库函数，开平方的，要加头文件math.h
//									  //我要求i是不是素数，本来要整除2到i-1，优化后我只要整除2到根号i
//		{
//						   
//			if (i % j == 0)//把不是素数的break
//				//这里不能用i % j != 0,因为这种要判断完所有的情况才能break
//						   //而i % j == 0,只要遇到一个这样的情况，就可以break
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			printf("%d \n", i);
//			count++;//计算素数的个数
//		}
//
//	}
//	printf("%d", count);//注：一个语句在哪，要看它在顺序，选择，循环的结构中发挥
//
//	return 0;
//}



//<8>goto语句
//int main()
//{
//	printf("呵呵\n");
//	goto next;//next是一个跳转标号，是可以根据实际情况命名的
//	printf("哈哈\n");//goto创建一个跳转标号，在另一处写下跳转标号，会跳过跳转标号之间的代码
//next:
//	printf("嘿嘿\n");
//
//	return 0;
//}//尽量不使用goto语句，会导致程序混乱
	//但在一些方面，goto语句还是方便的，比如跳出多组嵌套循环（相对于break来说的，break只能跳出一组嵌套循环）



//<9>关机程序
#include <stdlib.h>
#include <string.h>
//int main()
//{
//	again:
//	printf("请注意：你的电脑将在一分钟内关机；如果输入：我是猪，则取消关机\n");
//	system("shutdown -s -t 60");//system是向电脑系统中的命令提示符传达指令的
//	char input[20] = { 0 };		//system也是一个库函数，要用头文件stdlib.h
//	scanf("%s", input);//input是数组里的，不用取地址
//	if (strcmp(input, "我是猪") == 0)//判断两个字符串是否相等用strcmp（判断input和我是猪是否相等）
//	{								 //如果两个字符串相等，strcmp返回0
//		system("shutdown -a");		 //strcmp是库函数，要用头文件string.h
//	}
//	else
//	{
//		goto again;
//	}
//
//	return 0;
//}